package com.bzkj.document.mapper;

import org.apache.ibatis.annotations.Param;

import java.util.HashMap;
import java.util.List;
import java.util.Set;

/**
 * @projectName: prt-wms
 * @package: com.bzkj.document.mapper
 * @className: WmsWareHouseInventoryMapper
 * @description: NCC签字后库存管理持久层
 * @author: C1309
 * @createDate: 2024年12月23日
 * @version: v1.0
 */
public interface WmsWareHouseInventoryMapper {

    /**
     * 入库库存管理
     *
     * @param vbillCode 单据号
     * @param billType  单据类型
     * @return 结果
     */
    int wmsWarehouseIn(@Param("vbillCode") String vbillCode,
                       @Param("billType") String billType);

    /**
     * 入库库存管理
     *
     * @param vBillCode 单据号
     * @param billType  单据类型
     * @return 结果
     */
    Integer wmsWarehouseOut(@Param("vbillCode") String vBillCode, @Param("billType") String billType);

    /**
     * 判断库存是否充足
     *
     * @param billType   单据类型
     * @param vbillcode  单据号
     * @param pkMaterial 物料编码
     * @param batchNo    批号
     * @param quantity   数量
     * @param cstateid   状态
     * @param operType   操作类型
     * @return 结果
     */
    int isEnough(@Param("vbillcode") String vbillcode,
                 @Param("billType") String billType,
                 @Param("pkMaterial") String pkMaterial,
                 @Param("batchNo") String batchNo,
                 @Param("quantity") Object quantity,
                 @Param("operType") String operType,
                 @Param("cstateid") String cstateid,
                 @Param("manufacturer") String manufacturer,
                 @Param("cwarehouseid") String cwarehouseid);

    /***
     * 获取货位、仓库模式、批号
     * @param vbillcode 单据号
     * @param billType 单据类型
     * @param pkMaterial 物料编码
     * @param batchNo 批号
     * @param quantity 数量
     * @param wareHouse NCC库房ID
     * @param cstateid 库存状态
     * @return 结果
     */
    HashMap<String, String> wmsSkuRulesUnit(@Param("vbillcode") String vbillcode,
                                            @Param("billType") String billType,
                                            @Param("pkMaterial") String pkMaterial,
                                            @Param("batchNo") String batchNo,
                                            @Param("quantity") Object quantity,
                                            @Param("wareHouse") String wareHouse,
                                            @Param("cstateid") String cstateid);

    /**
     * WMS自动匹配NCC仓库
     *
     * @param pk          商品主键
     * @param warehousePk 仓库主键
     * @return 仓库信息
     */
    List<HashMap<String, String>> selectNccWarehouse(@Param("pk") String pk,
                                                     @Param("warehousePk") String warehousePk);

    /**
     * 判断转库类型
     *
     * @param from 入库仓库
     * @param to   出库仓库
     * @return 转库类型
     */
    String selectMovementType(@Param("from") String from, @Param("to") String to);

    /**
     * 查询是否为保质期、有效期管理
     *
     * @param pk 商品主键
     * @return 查询结果
     */
    HashMap<String, Object> selectAdditionalManagement(String pk);

    /**
     * 查询WMS管理的仓库
     *
     * @return 结果
     */
    Set<String> selectWarehouseId();

    /**
     * 查询物料类型
     *
     * @param pkMaterial 物料主键
     * @return 结果
     */
    String selectMaterialType(@Param("pkMaterial") String pkMaterial);

    /**
     * 检验批号的唯一性
     *
     * @param batchNo 批号
     * @return 结果
     */
    int checkBatchNoUnique(String batchNo);

    /**
     * 修改货位
     *
     * @param vbillcode 单据号
     * @param tableName 表名
     * @param freight   货位
     * @return 结果
     */
    int changeFreight(@Param("vbillcode") String vbillcode,
                      @Param("tableName") String tableName,
                      @Param("freight") String freight,
                      @Param("cgeneralbid") String cgeneralbid);

    /**
     * 检查货位是否可用
     *
     * @param warehouse 仓库PK
     * @param freight   货位
     * @return 结果
     */
    List<HashMap<String, String>> checkFreight(@Param("warehouse") String warehouse, @Param("freight") String freight);

    /**
     * 获取转库类型
     *
     * @param vbillcode 单据号
     * @return 转库类型
     */
    String getTransType(String vbillcode);

    /**
     * 修改转库单货位
     *
     * @param vbillcode   单据号
     * @param freight     货位
     * @param cgeneralbid 通用业务单ID
     * @param fieldName   字段名
     * @return 结果
     */
    int changeZkFreight(@Param("vbillcode") String vbillcode,
                        @Param("freight") String freight,
                        @Param("cgeneralbid") String cgeneralbid,
                        @Param("fieldName") String fieldName);

    /**
     * 修改签字时间
     * @param vbillcode 单据号
     * @param cgeneralhid 表头主键
     * @param signTime 新的时间
     * @param updateBy 修改人
     * @return 结果
     */
    int changeSignTime(@Param("vbillcode")String vbillcode,
                       @Param("cgeneralhid") String cgeneralhid,
                       @Param("signTime") String signTime,
                       @Param("updateBy") String updateBy,
                       @Param("tableName") String tableName,
                       @Param("pk") String pk);
}
